// 消息页面
// 导入路径辅助模块，避免重复引用
const pathImport = require('../helpers/path_import.js');
const { cacheHelper, pageHelper, cloudHelper } = pathImport;;
const ProjectBiz = require('../../../comm/biz/project_biz.js');
const { logEvent } = require('../../../helpers/log_helper.js');
const { getNetworkStatus, listenNetworkStatus } = require('../../../helpers/network_helper.js');

// 引入MobX相关
const { createStoreBindings } = require('../../../../../miniprogram_npm/mobx-miniprogram-bindings/index');
const { userStore } = require('../../../../../store/modules/user/index.js');
const { messageStore } = require('../../../../../store/modules/message/index.js');
const { uiStore } = require('../../../../../store/global/ui.js');

Page({
	/**
	 * 页面的初始数据
	 */
	data: {
		tabs: ['所有消息', '未读消息', '已读消息']
	},

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: async function (options) {
		// 网络检测
		const net = await getNetworkStatus();
		if (!net.isConnected) {
			wx.showToast({ title: '当前无网络，请检查连接', icon: 'none' });
		} else if (net.networkType === '2g') {
			wx.showToast({ title: '当前为2G弱网，体验可能受影响', icon: 'none' });
		}
		listenNetworkStatus((res) => {
			if (!res.isConnected) wx.showToast({ title: '网络已断开', icon: 'none' });
			else if (res.networkType === '2g') wx.showToast({ title: '当前为2G弱网', icon: 'none' });
		});
		logEvent('page_load', { page: 'message_index' });
		// 创建MobX绑定
		this.storeBindings = createStoreBindings(this, {
			store: userStore,
			fields: ['isLogin', 'user'],
			actions: ['init', 'getUserInfo']
		});

		// 创建消息Store绑定 - 同时绑定新旧字段和方法
		this.messageStoreBindings = createStoreBindings(this, {
			store: messageStore,
			fields: [
				'messageList',  // 兼容字段
				'list',         // 新字段
				'unreadCount', 
				'loading',
				'hasMore',
				'filteredMessageList',
				'filteredList', // 新字段
				'filterMode'
			],
			actions: [
				'loadList',      // 新方法
				'loadMessageList', // 兼容方法
				'markAsRead',     // 新方法
				'markMessageAsRead', // 兼容方法
				'markAllAsRead',
				'deleteMessage',
				'clearMessages',
				'setFilterMode'
			]
		});
		
		// 创建UI Store绑定
		this.uiStoreBindings = createStoreBindings(this, {
			store: uiStore,
			fields: ['isLoad'],
			actions: ['setIsLoad']
		});

		// 初始化用户状态
		this.init();
		
		// 页面初始化
		ProjectBiz.initPage(this);

		if (this.data.isLogin) {
			// 加载消息列表
			await this._loadMessageList();
		}

		// 设置页面加载完成
		if (typeof this.setIsLoad === 'function') {
			this.setIsLoad(true);
		} else {
			console.warn('setIsLoad方法不可用，可能UI Store未正确初始化');
			// 设置页面数据状态为表明已加载完成
			this.setData({
				isLoad: true
			});
		}
	},

	/**
	 * 加载消息列表
	 */
	_loadMessageList: async function() {
		try {
			// 使用新方法或兼容方法加载消息列表
			if (this.loadList) {
				await this.loadList(true);
			} else if (this.loadMessageList) {
				await this.loadMessageList();
			}
		} catch (err) {
			console.error('加载消息列表失败', err);
			pageHelper.showModal('加载消息失败，请重试');
		}
	},

	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady: function () {

	},

	/**
	 * 生命周期函数--监听页面显示
	 */
	onShow: async function () {
		// 如果已登录但尚未加载消息列表，加载消息列表
		if (this.data.isLogin && (!this.data.messageList || this.data.messageList.length === 0)) {
			await this._loadMessageList();
		}
	},

	/**
	 * 生命周期函数--监听页面隐藏
	 */
	onHide: function () {

	},

	/**
	 * 生命周期函数--监听页面卸载
	 */
	onUnload: function () {
		// 清理MobX绑定
		this.storeBindings.destroyStoreBindings();
		this.messageStoreBindings.destroyStoreBindings();
		this.uiStoreBindings.destroyStoreBindings();
	},

	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh: async function () {
		if (!this.data.isLogin) {
			wx.stopPullDownRefresh();
			return;
		}

		await this._loadMessageList();
		wx.stopPullDownRefresh();
	},

	/**
	 * 页面上拉触底事件的处理函数
	 */
	onReachBottom: async function () {
		// 如果正在加载或没有更多数据，不执行
		if (this.data.loading && (this.data.loading.messages || this.data.loading.list) || !this.data.hasMore) return;

		// 加载更多消息 - 使用新方法或兼容方法
		if (this.loadList) {
			await this.loadList(false);
		} else if (this.loadMessageList) {
			await this.loadMessageList(this.data.messageList.length);
		}
	},

	/**
	 * 切换选项卡
	 */
	bindTabSelect: function(e) {
		const tabCur = e.currentTarget.dataset.id;
		// 根据选项卡设置消息过滤模式
		const filterMode = tabCur === 0 ? 'all' : (tabCur === 1 ? 'unread' : 'read');
		this.setFilterMode(filterMode);
	},

	/**
	 * 标记消息为已读
	 */
	bindMessageTap: async function(e) {
		const id = e.currentTarget.dataset.id;
		if (!id) return;

		try {
			// 标记为已读 - 使用新方法或兼容方法
			if (this.markAsRead) {
				await this.markAsRead(id);
			} else if (this.markMessageAsRead) {
				await this.markMessageAsRead(id);
			}
			
			// 处理消息的点击跳转逻辑
			// 尝试在两个可能的数组中查找消息
			const messageArray = this.data.list || this.data.messageList || [];
			const item = messageArray.find(item => item._id === id || item.id === id);
			
			if (item && (item.url || item.URL)) {
				wx.navigateTo({
					url: item.url || item.URL
				, timeout: 10000, fail: function(err) {
        // 处理超时错误
        if (err.errMsg && err.errMsg.includes("timeout")) {
          wx.showToast({
            title: "页面加载超时，请重试",
            icon: "none"
          });
          return;
        }
        
        // 处理其他错误
        console.error("页面跳转失败:", err);
        wx.showToast({
          title: "页面跳转失败",
          icon: "none"
        });
      }});
			}
		} catch (err) {
			console.error('标记消息已读失败', err);
		}
	},

	/**
	 * 一键标记所有消息为已读
	 */
	bindMarkAllTap: async function(e) {
		try {
			await this.markAllAsRead();
			pageHelper.showSuccToast('操作成功');
		} catch (err) {
			console.error('标记全部已读失败', err);
			pageHelper.showModal('操作失败，请重试');
		}
	},

	/**
	 * 删除消息
	 */
	bindDeleteTap: async function(e) {
		const id = e.currentTarget.dataset.id;
		if (!id) return;

		let that = this;
		pageHelper.showConfirm('确认删除该消息?', async () => {
			try {
				await that.deleteMessage(id);
				pageHelper.showSuccToast('删除成功');
			} catch (err) {
				console.error('删除消息失败', err);
				pageHelper.showModal('删除失败，请重试');
			}
		});
	},

	/**
	 * 清空所有消息
	 */
	bindClearTap: async function(e) {
		let that = this;
		pageHelper.showConfirm('确认清空所有消息?', async () => {
			try {
				await that.clearMessages();
				pageHelper.showSuccToast('清空成功');
			} catch (err) {
				console.error('清空消息失败', err);
				pageHelper.showModal('操作失败，请重试');
			}
		});
	},

	url: function(e) {
		pageHelper.url(e, this);
	},

	switchTab: function(e) {
		let tab = e.currentTarget.dataset.tab;
		logEvent('switch_tab', { tab });
		this.setData({
			currentTab: tab
		});
	}
}) 